home *** CD-ROM | disk | FTP | other *** search
- #include <types.h>
- #include <stdio.h>
-
- #include "::TiffLibrary:tifflib.h"
- #include "td.h"
-
- char *tagName();
- char *typeName();
- unsigned short SwapShortBytes();
- unsigned long SwapLongBytes();
- char *gethex();
- char hex();
-
- char *pgrm;
- char *filename;
-
- TiffHeader header;
- Boolean swapBytes;
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- int fd;
- Int16 ifdCount;
- int ifdOffset;
- int ifdNum;
-
- pgrm = argv[0];
- if (argc != 2) {
- fprintf(stderr, "usage: %s file\n", argv[0]);
- exit(1);
- }
- filename = argv[1];
-
- if ((fd = open(filename, 0)) < 0) {
- fprintf(stderr, "%s: can't open %s\n", pgrm, filename);
- exit(1);
- }
- if (read(fd, &header, sizeof(header)) != sizeof(header)) {
- fprintf(stderr, "%s: can't read %s\n", pgrm, filename);
- exit(1);
- }
- if (header.byteOrder == INTEL) {
- swapBytes = true;
- header.version = SwapShortBytes(header.version);
- header.dirOffset = SwapLongBytes(header.dirOffset);
- }
- else
- swapBytes = false;
-
- printf("\nTIFF FILE %s:\n\nHeader:\n\n", filename);
- printf("\tbyteorder='%c%c'(0x%X)\n\tversion=%d(0x%X)\n\tdirOffset=0x%lX\n",
- header.byteOrder,
- header.byteOrder, header.byteOrder >> 8,
- header.version,
- header.version,
- header.dirOffset);
-
- ifdOffset = header.dirOffset;
- for (ifdNum = 0; ifdOffset != 0; ifdNum++)
- ifdOffset = readIFD(fd, ifdOffset);
-
- close(fd);
- }
-
- Int32 readIFD(fd, ifdOffset)
- Int32 ifdOffset;
- {
- unsigned char *pByte;
- int i;
- UInt16 ifdCount,
- *pShort;
- TiffDirEntry ifdEntry;
- UInt32 offset;
-
- if (lseek(fd, ifdOffset, 0) < 0) {
- fprintf(stderr, "%s: seek error: %s\n", pgrm, filename);
- exit(1);
- }
- readShort(fd, &ifdCount);
- printf("\nIFD: 0x%X(%d.) entries @0x%lX:\n\n",
- ifdCount,
- ifdCount,
- ifdOffset);
- for (i = 0; i < ifdCount; i++) {
- if (read(fd, &ifdEntry, sizeof(ifdEntry)) != sizeof(ifdEntry)) {
- fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
- exit(1);
- }
- if (swapBytes) {
- ifdEntry.tag = SwapShortBytes(ifdEntry.tag);
- ifdEntry.type = SwapShortBytes(ifdEntry.type);
- ifdEntry.length = SwapLongBytes(ifdEntry.length);
- if ( ((ifdEntry.length * typeSize(ifdEntry.type)) > 4) ||
- (ifdEntry.type == LONG) ) {
- /* it's a long value or a long offset so swap it */
- ifdEntry.valueOffset = SwapLongBytes(ifdEntry.valueOffset);
- }
- else if (ifdEntry.type == SHORT) {
- /* it's either one or two shorts, swap both anyway */
- pShort = (Int16 *)&ifdEntry.valueOffset;
- *pShort++ = SwapShortBytes(*pShort);
- *pShort = SwapShortBytes(*pShort);
- }
- /* else type must be BYTE or ASCII so now swap needed */
- }
- printf("%s %3ld %s:",
- tagName(ifdEntry.tag), ifdEntry.length, typeName(ifdEntry.type));
- printValue(fd, ifdEntry.type, ifdEntry.length, ifdEntry.valueOffset);
- }
- readLong(fd, &ifdOffset);
- return(ifdOffset);
- }
-
- printValue(fd, type, length, offset)
- int fd;
- UInt16 type;
- UInt32 length, offset;
- {
- static char buf[80];
- unsigned char *p;
- unsigned char Byte;
- unsigned short Short;
- unsigned long Long;
- Rational Rat;
- int size;
- UInt32 n, oldOffset;
-
- size = typeSize(type);
- if ((size * length) <= 4) { /* value(s) in directory entry */
- if (type == ASCII)
- putchar('"');
- for (n = 0; n < length; n++) {
- switch (type) {
- case BYTE:
- printf("0x%X ", (int)( ((unsigned char *)(&offset))[n]));
- break;
- case ASCII:
- printf("%c", (int)( ((unsigned char *)(&offset))[n]));
- break;
- case SHORT:
- printf("0x%X ", (int)( ((unsigned short *)(&offset))[n]));
- break;
- case LONG:
- printf("0x%lX ", offset);
- break;
- }
- }
- if (type == ASCII)
- putchar('"');
- }
- else { /* value(s) at given offset */
- printf("values @0x%lX:",offset);
- if ((oldOffset = lseek(fd, 0L, 1)) < 0) {
- fprintf(stderr, "%s: seek error: %s\n", pgrm, filename);
- exit(1);
- }
- if (lseek(fd, offset, 0) < 0) {
- fprintf(stderr, "%s: seek error: %s\n", pgrm, filename);
- exit(1);
- }
- putchar('\n');
- if (type == ASCII)
- printf("\t\"");
- for (n = 0; n < length; n++) {
- if (type != ASCII)
- putchar('\t');
- switch (type) {
- case BYTE:
- readByte(fd, &Byte);
- sprintf(buf, "0x%lX", Byte);
- pad(buf, 2 + (2 * sizeof(Byte)));
- printf("%s", buf);
- break;
- case ASCII:
- readByte(fd, &Byte);
- putchar(Byte);
- break;
- case SHORT:
- readShort(fd, &Short);
- sprintf(buf, "0x%lX", Short);
- pad(buf, 2 + (2 * sizeof(Short)));
- printf("%s", buf);
- break;
- case LONG:
- readLong(fd, &Long);
- sprintf(buf, "0x%lX", Long);
- pad(buf, 2 + (2 * sizeof(Long)));
- printf("%s", buf);
- break;
- case RATIONAL:
- readRational(fd, &Rat);
- printf("%s/", gethex(Rat.numerator, sizeof(Rat.numerator)));
- sprintf(buf, "0x%lX", Rat.denominator);
- pad(buf, 2 + (2 * sizeof(Long)));
- printf("%s", buf);
- break;
- }
- if ((type != ASCII) && (n % 4 == 3))
- putchar('\n');
- }
- if (type == ASCII)
- putchar('"');
- if (lseek(fd, oldOffset, 0) < 0) {
- fprintf(stderr, "%s: seek error: %s\n", pgrm, filename);
- exit(1);
- }
- }
- putchar('\n');
- }
-
- typeSize(type)
- Int16 type;
- {
- switch (type) {
- case BYTE:
- return(BYTESIZE);
- break;
- case ASCII:
- return(ASCIISIZE);
- break;
- case SHORT:
- return(SHORTSIZE);
- break;
- case LONG:
- return(LONG);
- break;
- case RATIONAL:
- return(RATSIZE);
- break;
- }
- }
-
- char *tagName(tag)
- Int16 tag;
- {
- static char buf[80];
-
- switch (tag) {
- case SUBFILE_TYPE_TAG:
- sprintf(buf, "SubfileType");
- break;
- case IMAGE_WIDTH_TAG:
- sprintf(buf, "ImageWidth");
- break;
- case IMAGE_LENGTH_TAG:
- sprintf(buf, "ImageLength");
- break;
- case BITS_PER_SAMPLE_TAG:
- sprintf(buf, "BitsPerSample");
- break;
- case COMPRESSION_TAG:
- sprintf(buf, "Compression");
- break;
- case PHOTOMETRIC_INTERP_TAG:
- sprintf(buf, "PhotometricInterpretation");
- break;
- case THRESHOLDING_TAG:
- sprintf(buf, "Threshholding");
- break;
- case CELL_WIDTH_TAG:
- sprintf(buf, "CellWidth");
- break;
- case CELL_LENGTH_TAG:
- sprintf(buf, "CellLength");
- break;
- case FILL_ORDER_TAG:
- sprintf(buf, "FillOrder");
- break;
- case DOCUMENT_NAME_TAG:
- sprintf(buf, "DocumentName");
- break;
- case IMAGE_DESCRIPTION_TAG:
- sprintf(buf, "ImageDescription");
- break;
- case MAKE_TAG:
- sprintf(buf, "Make");
- break;
- case MODEL_TAG:
- sprintf(buf, "Model");
- break;
- case STRIP_OFFSETS_TAG:
- sprintf(buf, "StripOffsets");
- break;
- case ORIENTATION_TAG:
- sprintf(buf, "Orientation");
- break;
- case SAMPLES_PER_PIXEL_TAG:
- sprintf(buf, "SamplesPerPixel");
- break;
- case ROWS_PER_STRIP_TAG:
- sprintf(buf, "RowsPerStrip");
- break;
- case STRIP_BYTE_COUNTS_TAG:
- sprintf(buf, "StripByteCounts");
- break;
- case MIN_SAMPLE_VALUE_TAG:
- sprintf(buf, "MinSampleValue");
- break;
- case MAX_SAMPLE_VALUE_TAG:
- sprintf(buf, "MaxSampleValue");
- break;
- case X_RESOLUTION_TAG:
- sprintf(buf, "XResolution");
- break;
- case Y_RESOLUTION_TAG:
- sprintf(buf, "YResolution");
- break;
- case PLANAR_CONFIG_TAG:
- sprintf(buf, "PlanarConfiguration");
- break;
- case PAGE_NAME_TAG:
- sprintf(buf, "PageName");
- break;
- case X_POSITION_TAG:
- sprintf(buf, "XPosition");
- break;
- case Y_POSITION_TAG:
- sprintf(buf, "YPosition");
- break;
- case FREE_OFFSETS_TAG:
- sprintf(buf, "FreeOffsets");
- break;
- case FREE_BYTE_COUNTS_TAG:
- sprintf(buf, "FreeByteCounts");
- break;
- case UNITS_GRAY_RESPONSE:
- sprintf(buf, "GrayResponseUnit");
- break;
- case CURVE_GRAY_RESPONSE:
- sprintf(buf, "GrayResponseCurve");
- break;
- case 0x124: /* Group3Options */
- sprintf(buf, "name");
- break;
- case 0x125: /* Group4Options */
- sprintf(buf, "name");
- break;
- case 0x128: /* ResolutionUnit */
- sprintf(buf, "name");
- break;
- case 0x129: /* PageNumber */
- sprintf(buf, "name");
- break;
- case 0x12C: /* ColorResponseUnit */
- sprintf(buf, "name");
- break;
- case 0x12D: /* ColorResponseCurves */
- sprintf(buf, "name");
- break;
- default:
- sprintf(buf, "%03x", tag);
- break;
- }
- pad(buf, strlen("PhotometricInterpretation"));
- return(buf);
- }
-
- char *typeName(type)
- Int16 type;
- {
- switch (type) {
- case BYTE:
- return("Byte ");
- break;
- case ASCII:
- return("Ascii ");
- break;
- case SHORT:
- return("Short ");
- break;
- case LONG:
- return("Long ");
- break;
- case RATIONAL:
- return("Rational");
- break;
- }
- }
-
- pad(buf, n)
- char *buf;
- int n;
- {
- register char *pStart, *pEnd;
-
- pEnd = buf + n;
- pStart = buf;
- while (*pStart != '\0')
- pStart++;
- while (pStart <= pEnd) {
- *pStart++ = ' ';
- }
- *pStart = '\0';
- }
-
- unsigned short SwapShortBytes(s)
- register unsigned short s;
- {
- s = (s >> 8) | (s << 8);
- return(s);
- }
-
- unsigned long SwapLongBytes(l)
- register unsigned long l;
- {
- l = ((l >> 24) ) |
- ((l >> 8) & 0x0000FF00 ) |
- ((l << 8) & 0x00FF0000 ) |
- ((l << 24) );
- return(l);
- }
-
- readByte(fd, byteBuf)
- char *byteBuf;
- {
- if (read(fd, byteBuf, BYTESIZE) != BYTESIZE) {
- fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
- exit(1);
- }
- }
-
- readShort(fd, shortBuf)
- short *shortBuf;
- {
- if (read(fd, shortBuf, SHORTSIZE) != SHORTSIZE) {
- fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
- exit(1);
- }
- if (swapBytes)
- *shortBuf = SwapShortBytes(*shortBuf);
- }
-
- readLong(fd, longBuf)
- long *longBuf;
- {
- if (read(fd, longBuf, LONGSIZE) != LONGSIZE) {
- fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
- exit(1);
- }
- if (swapBytes)
- *longBuf = SwapLongBytes(*longBuf);
- }
-
-
- readRational(fd, ratBuf)
- Rational *ratBuf;
- {
- if (read(fd, ratBuf, RATSIZE) != RATSIZE) {
- fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
- exit(1);
- }
- if (swapBytes) {
- ratBuf->numerator = SwapLongBytes(ratBuf->numerator);
- ratBuf->denominator = SwapLongBytes(ratBuf->denominator);
- }
- }
-
- #define LFMTSIZE 2
- #define LMAXDIGITS 8
-
- char *gethex(value, size)
- int size;
- register unsigned long value;
- {
- register char *p;
- register int i;
- static char buf[LFMTSIZE + LMAXDIGITS + 1];
- static char fmt[LFMTSIZE] = "0x";
-
- if ((size * 2) > LMAXDIGITS)
- return("########");
- p = &buf[(size * 2) + LFMTSIZE];
- *p-- = '\0'; /* null terminate */
- while (value > 0) { /* put hex val at end of buffer */
- *p-- = hex(value % 0x10);
- value /= 0x10;
- }
- for (i = (LFMTSIZE - 1); i >= 0 ; i--) /* prepend format */
- *p-- = fmt[i];
- while (p >= buf) /* put in leading blanks */
- *p-- = ' ';
- return(buf);
- }
-
- char hex(val)
- {
- if ((val > 0) && (val < 10))
- return(val + '0');
- else if (val < 0x10)
- return(val - 0xA + 'A');
- else
- return('#');
- }